<?php
/**
 * 尚善福· 支付宝支付模块的逻辑处理
 * ============================================================================
 * 版权所有 2017-2022 北京优特世纪科技有限公司，并保留所有权利。
 * 网站地址: http://www.unitewww.com；
 * ============================================================================
 * 这不是一个自由软件！您只能在不用于商业目的的前提下对程序代码进行修改和
 * 使用；不允许对程序代码以任何形式任何目的的再发布。
 * ============================================================================
 * @since: 1.0
 * @version: 1.0
 **/
namespace Home\Controller;
class TalipayController extends BaseController{
	/**
	+--------------------------------------------------------------------------
	* 统一编码，加载配置
	+--------------------------------------------------------------------------
	*/
	public function _initialize() {
		header ('Content-Type:text/html; charset=utf-8' );
		Vendor('Alipay.Corefunction');
		Vendor('Alipay.Md5function');
		Vendor('Alipay.Notify');
		Vendor('Alipay.Submit');
	}
	/**
	+--------------------------------------------------------------------------
	* 支付参数获取并设置
	* @date: 2017-07-28
	+--------------------------------------------------------------------------
	*/
	function payConfig(){
		//实例化相关表
        $plident = M('plugin');
        //查询配置信息
        $plFind = $plident->where("`pl_code`='alipay'")->find();
        $option = unserialize($plFind['pl_value']);
        
        //支付宝配置参数
		$conf['partner']      = $option['partner']; //成功申请支付宝接口后获取到的PID；
		$conf['key']          = $option['yaokey']; //成功申请支付宝接口后获取到的Key
		$conf['sign_type']    = strtoupper('MD5');
		$conf['input_charset']= strtolower('utf-8');
		$conf['cacert']       = getcwd().'\\cacert.pem';
		$conf['transport']    = 'http';
		//这里是卖家的支付宝账号，也就是你申请接口时注册的支付宝账号
		$conf['seller_email'] = $option['sellerId'];
		//这里是异步通知页面url，提交到项目的Pay控制器的notifyurl方法；
		$conf['notify_url']   = 'http://'.$_SERVER['HTTP_HOST'].'/Home/Talipay/notifyurl';
		//这里是页面跳转通知url，提交到项目的Pay控制器的returnurl方法；
		$conf['return_url']   = 'http://'.$_SERVER['HTTP_HOST'].'/Home/Talipay/returnurl';
		//支付成功跳转到的页面，我这里跳转到项目的User控制器，myorder方法，并传参payed（已支付列表）
		//$conf['successpage']  = U('Home/index');
		//支付失败跳转到的页面，我这里跳转到项目的User控制器，myorder方法，并传参unpay（未支付列表）
		$conf['errorpage']    = U('Index/index');
		return $conf;
	}
	/**
	+--------------------------------------------------------------------------
	* 实现商城购买消费
	* @date: 2018-04-18
	+--------------------------------------------------------------------------
	*/
	public function orderPay(){
		//接收值
		$oid = trim(I('get.oid'));
		//实例化相关类
		$orident = M("order");
		//获取数据信息
		$orFind = $orident->where("`or_batch`='".$oid."'")->find();
		//判断是否存在该订单
		if(count($orFind)=='0'){
			$this->error("订单不存在",'/Home/Order/orderList');
		}
		$money = $orFind['or_zmon'];
		$title = "购买商城商品";
		$conte = $title."消费".$money."元。";
		$this->alipay($oid,$title,$money,$conte);
	}
	/**
	+--------------------------------------------------------------------------
	* 支付宝集成付款参数
	* @param  $batch 订单号
	* @param  $title 订单名称
	* @param  $money 支付金额
	* @param  $content 订单描述
	* @author:XC跃
	* @date: 2018-04-19
	+--------------------------------------------------------------------------
	*/
	public function alipay($batch,$title,$money,$content=''){
		//获取配置项参数
		$alipay_config= $this->payConfig();
		//dump($alipay_config);die;
		/**************************请求参数**************************/
		$payment_type= "1"; //支付类型：必填    默认值为：1（商品购买）
		$notify_url  = $alipay_config['notify_url']; //服务器异步通知页面路径
		$return_url  = $alipay_config['return_url']; //页面跳转同步通知页面路径
		$seller_email= $alipay_config['seller_email'];//卖家支付宝帐户必填
		$out_trade_no= $batch;    //商户订单号
		$subject     = $title;    //订单名称 //必填
		$total_fee   = $money;    //付款金额  //必填
		$body        = $content;  //订单描述 通过支付页面的表单进行传递
		$show_url    = 'http://'.$_SERVER['HTTP_HOST'];  //商品展示地址 通过支付页面的表单进行传递
		$anti_phishing_key= "";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数
		$exter_invoke_ip  = get_client_ip(); //客户端的IP地址
		/************************************************************/

		//构造要请求的参数数组，无需改动
		$parameter = array(
			"service"          => "alipay.wap.create.direct.pay.by.user",
			"partner"          => trim($alipay_config['partner']),
			"payment_type"     => $payment_type,
			"notify_url"       => $notify_url,
			"return_url"       => $return_url,
			"seller_id"        => $seller_email,
			"out_trade_no"     => $out_trade_no,
			"subject"          => $subject,
			"total_fee"        => $total_fee,
			"body"             => $body,
			"show_url"         => $show_url,
			"anti_phishing_key"=> $anti_phishing_key,
			"exter_invoke_ip"  => $exter_invoke_ip,
			"_input_charset"   => trim(strtolower($alipay_config['input_charset'])),
		);
		//dump($parameter);die;
		//建立请求
		$alipaySubmit = new \AlipaySubmit($alipay_config);
		$html_text = $alipaySubmit->buildRequestForm($parameter,"post", "确认");
		echo $html_text;
	}
	/**
	+--------------------------------------------------------------------------
	* 服务器异步通知页面方法
	* @author:XC跃
	* @date: 2018-04-19
	+--------------------------------------------------------------------------
	*/
	function notifyurl(){
		//这里还是通过C函数来读取配置项，赋值给$alipay_config
		$alipay_config = $this->payConfig();
		//计算得出通知验证结果
		$alipayNotify = new \AlipayNotify($alipay_config);
		$verify_result= $alipayNotify->verifyNotify();
		if($verify_result) {
			//验证成功
			//获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
			$out_trade_no   = $_POST['out_trade_no'];      //商户订单号
			$trade_no       = $_POST['trade_no'];          //支付宝交易号
			$trade_status   = $_POST['trade_status'];      //交易状态
			$total_fee      = $_POST['total_fee'];         //交易金额
			$notify_id      = $_POST['notify_id'];         //通知校验ID。
			$notify_time    = $_POST['notify_time'];       //通知的发送时间。格式为yyyy-MM-dd HH:mm:ss。
			$buyer_email    = $_POST['buyer_email'];       //买家支付宝帐号；
			$parameter = array(
				"out_trade_no"  => $out_trade_no, //商户订单编号；
				"trade_no"     	=> $trade_no,     //支付宝交易号；
				"total_fee"     => $total_fee,    //交易金额；
				"trade_status"  => $trade_status, //交易状态
				"notify_id"     => $notify_id,    //通知校验ID。
				"notify_time"   => $notify_time,  //通知的发送时间。
				"buyer_email"   => $buyer_email,  //买家支付宝帐号；
			);
			if($_POST['trade_status'] == 'TRADE_FINISHED'){
				//
			}elseif($_POST['trade_status'] == 'TRADE_SUCCESS'){

			}
			echo "success";        //请不要修改或删除
		}else{
			//验证失败
			echo "fail";
		}
	}
	/**
	+--------------------------------------------------------------------------
	* 同步处理方法 页面跳转处理方法
	* @author:XC跃
	* @date: 2018-04-19
	+--------------------------------------------------------------------------
	*/
	function returnurl(){
		//头部的处理跟上面两个方法一样，这里不罗嗦了！
		$alipay_config = $this->payConfig();
		$alipayNotify  = new \AlipayNotify($alipay_config); //计算得出通知验证结果
		$verify_result = $alipayNotify->verifyReturn();
		if($verify_result) {
			//验证成功
			//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表
			$out_trade_no   = $_GET['out_trade_no'];      //商户订单号
			$trade_no       = $_GET['trade_no'];          //支付宝交易号
			$trade_status   = $_GET['trade_status'];      //交易状态
			$total_fee      = $_GET['total_fee'];         //交易金额
			$notify_id      = $_GET['notify_id'];         //通知校验ID。
			$notify_time    = $_GET['notify_time'];       //通知的发送时间。
			$buyer_email    = $_GET['buyer_email'];       //买家支付宝帐号；
			$parameter = array(
				"out_trade_no" => $out_trade_no,      //商户订单编号；
				"trade_no"     => $trade_no,          //支付宝交易号；
				"total_fee"    => $total_fee,         //交易金额；
				"trade_status" => $trade_status,      //交易状态
				"notify_id"    => $notify_id,         //通知校验ID。
				"notify_time"  => $notify_time,       //通知的发送时间。
				"buyer_email"  => $buyer_email,       //买家支付宝帐号
			);
			if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS'){
				$this->orderhandle($parameter['out_trade_no'],$parameter['total_fee']);
				$this->redirect(U('Order/orderList'));
// 				if(stripos($parameter['out_trade_no'],'DJ') !== false){
// 				    $this->redirect(U('Index/index'));
// 				}
			}else{
				echo "trade_status=".$_GET['trade_status'];
				$this->redirect($alipay_config['errorpage']); //跳转到配置项中配置的支付失败页面；
			}
		}else{
			$this->redirect($alipay_config['errorpage']); //跳转到配置项中配置的支付失败页面；
		}
	}
	/**
	+--------------------------------------------------------------------------
	* 会员支付成功后处理函数
	* @param $batch   流水号
	* @param $money   支付金额
	* @date: 2018-04-19
	+--------------------------------------------------------------------------
	*/
	function orderhandle($batch,$money){
	    //$uname = session('user_auth.uname');
	    //实例化相关表
	    $orident = M('order');
		if(stripos($batch,'DJ') !== false){
// 		    $poFind= $poident->where("`po_batch`='".$batch."'")->find();
// 		    $pores = $poident->where("`po_batch`='".$batch."'")->setField('po_state','1');
// 		    if($pores>0){
// 		        $type = $poFind['po_type'];
// 		        //若类型为注册码或交易码，则重新生成相应的编码信息
// 		        if($type=='1' || $type=='2'){
// 		            add_user_code($poFind['po_uid'],$uname, $type, $poFind['po_num']);
// 		        }
// 		    }
		}else{
		    //修改订单信息
		    update_pay_status($batch,'2');
		}
	}
}
?>